package control;

import model.Aresta;
import model.ArrayListOrdenado;
import model.Constantes;
import model.Cromossomo;
import view.Saida;

public class Main {

	public static void main(String[] args) {
		
		long tempoInicial=System.currentTimeMillis();
		int iteracoes=0;
		
		Aresta[][] aresta;
		//inicializa o grafo
		aresta=Leitura.ler();
		int[][] listasParesSelecionados;
		ArrayListOrdenado populacaoAtual,filhos;
		Cromossomo cromossomo;
		int tamanhoPopulacao=0;
		
		//cria��o da populacao inicial
		if((int)Math.pow(aresta.length,2)/10<=100){
			tamanhoPopulacao=100;
		}else{
			tamanhoPopulacao=(int)Math.pow(aresta.length,2)/10;
			//tamanhoPopulacao=100;
		}
		populacaoAtual=new ArrayListOrdenado(0);
		for(int i=0;i<tamanhoPopulacao;i++){
			cromossomo=new Cromossomo(aresta.length);
			cromossomo.gerarCromossomoValido();
			cromossomo.calcularAptidao(aresta);
			populacaoAtual.add(cromossomo);
		}
		
		double distanciaMedia=0.01;
		while(!Cromossomo.obedeceCriterioParada(populacaoAtual,distanciaMedia)){
			
			iteracoes++;
			listasParesSelecionados=Cromossomo.selecao(populacaoAtual);
			filhos=Cromossomo.crossover(populacaoAtual, listasParesSelecionados, aresta);
			for(int i=0;i<filhos.size();i++){
				filhos.get(i).validarCromossomo(aresta);
			}
			Cromossomo.mutacao(filhos,aresta);
			populacaoAtual=Cromossomo.evolucao(populacaoAtual,filhos);
		}
		long tempoFinal=System.currentTimeMillis();
		
		new Saida(populacaoAtual.get(0).stringComResultado());
		
		long tempoTotal=tempoFinal-tempoInicial;
		
		System.out.println("tempo total=:"+tempoTotal);
		System.out.println("iteracoes="+iteracoes);
		System.out.println("aptidao="+populacaoAtual.get(0).GetAptidao());
		String temp=populacaoAtual.get(0).stringComResultado();
		
		//System.out.println("&"+tempoTotal+"&"+iteracoes+"&"+populacaoAtual.get(0).GetAptidao()+"&"+temp+"\\"+"\\");
		
		System.out.println(temp);
		System.out.println("alpha="+Constantes.ALFA);
		System.out.println("beta="+Constantes.BETA);
		System.out.println("gama="+Constantes.GAMA);
		System.out.println("ksi="+Constantes.KSI);
		System.out.println("escalas="+populacaoAtual.get(0).getNumeroEscalas());
		System.out.println("preco="+populacaoAtual.get(0).getPrecoTotal());
		System.out.println("tempoEspera="+populacaoAtual.get(0).getTempoEsperaTotal());
		System.out.println("tempo viagem"+populacaoAtual.get(0).getTempoViagemTotal());
		
	}
}
